<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        ajax({
            type: 'POST',
            url: 'http://121.43.116.41/php/login.php',
            data: {
                username: 'yy',
                password: '123'
            },
            success: res => {
                console.log(res);
            }
        })


        // ajax({
        //     type: 'get',
        //     url: 'http://121.43.116.41/php/detail.php',
        //     data: {
        //         id: 1
        //     },
        //     success: res => {
        //         console.log(res);
        //     }
        // })















        function ajax(options) {
            const {
                // 请求方式
                type,
                // 请求的路径
                url,
                // 是否异步
                async = true,   // 给变量默认值
                // 确认后端返回的数据类型
                dataType = 'json',   // 默认是json   只能是 json/ string
                // 
                data = {},
                // 数据请求成功之后做的事情
                success
            } = options;


            // 做参数的合法性判断
            if (type.toLowerCase() !== 'get' && type.toLowerCase() !== 'post') {
                throw new Error('请求方式不对');
            }

            // 判断路径   http / https 开头
            if (!url.startsWith('http') && !url.startsWith('https')) {
                throw new Error('请求路径不对');
            }

            if (typeof async !== 'boolean') {
                throw new Error('async只能是布尔值');
            }

            if (dataType.toLowerCase() !== 'json' && dataType.toLowerCase() !== 'string') {
                throw new Error('后端返回的数据类型必须是json或者string');
            }

            if (Object.prototype.toString.call(data) !== '[object Object]') {
                throw new Error('data必须是object');
            }

            if (Object.prototype.toString.call(success) !== '[object Function]') {
                throw new Error('success必须是函数');
            }




            // 把这个data变成字符串   {username:'yy' , password : 123}   username=yy&password=123

            let params = '';
            // 遍历对象
            for (let key in data) {
                params += `${key}=${data[key]}&`;
            }
            params = params.substring(0, params.length - 1);
            // console.log(params);




            const xhr = new XMLHttpRequest();


            // 区分  get / post
            if (type.toLowerCase() === 'get') {
                xhr.open(type, url + '?' + params, async);
                xhr.send();
            }
            else if (type.toLowerCase() === 'post') {
                xhr.open('post', url, true);

                // post请求需要携带请求头   
                xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

                // post请求是通过send携带参数   key=value&key=value
                xhr.send(params);
            }




            xhr.onreadystatechange = function () {
                if (this.readyState === 4 && this.status === 200) {
                    let data = this.responseText;
                    // console.log(data);
                    // 判断后端返回的数据类型
                    if (dataType === 'json') {
                        data = JSON.parse(data);
                    }


                    // 拿到数据之后做不同的事情
                    success(data);

                }
            }
        }

    </script>

</body>

</html>